package com.lqian.juc;

import java.util.concurrent.Semaphore;

/**
 * Semaphore，Java 版本的信号量实现。
 * 线程试图获得工作允许，得到许可则进行任务，然后释放许可，这时等待许可的其他线程，
 * 就可获得许可进入工作状态，直到全部处理结束。
 * 编译运行，我们就能看到 Semaphore 的允许机制对工作线程的限制。
 *
 * 从具体节奏来看
 * 其实并不符合我们前面场景的需求，因为本例中 Semaphore 的用法实际是保证，一直有 5 个人可以试图乘车
 * 如果有 1 个人出发了，立即就有排队的人获得许可，而这并不完全符合我们前面的要求。
 * @author：Melody_LQ
 * @time：2022/8/29 9:31 上午
 */
public class SemaphoreDemo01{

    public static void main(String[] args) {
        System.out.println("Action！...GO!");
        Semaphore semaphore = new Semaphore(5);
        for (int i = 0; i <10 ; i++) {
            Thread t = new Thread(new SemaphoreWorker(semaphore));
            t.start();
        }
    }


}

class SemaphoreWorker implements Runnable{
    private String name;
    private Semaphore semaphore;

    public SemaphoreWorker(Semaphore semaphore) {
        this.semaphore = semaphore;
    }

    @Override
    public void run() {

        try {
            log("is waiting for a permit");
            semaphore.acquire();
            log("acquired a permit");
            log("executed!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            log("released a permit");
            semaphore.release();
        }

    }

    private void log(String msg){
        if (name == null) {
            name = Thread.currentThread().getName();
        }
        System.out.println(name + "-->" +msg);
    }
}

